﻿// 游戏结束原因
const GameOverReason = {
    LOST: 0,        // 失败
    RIVAL_ADMIT: 1, // 自己认输
    SELF_ADMIT: 2,  // 对手认输
    WON: 3          // 胜利
}

// 协议类型
const ProtocolType = {
    FIND_USERS: 0,      // 寻找其它用户请求
    GAME_OVER: 1,       // 游戏结束
    INVITE_REQUEST: 2,  // 挑战请求
    INVITE_RESULT: 3,   // 挑战结果
    LOGON: 4,           // 登录
    PUT_PIECE: 5,       // 放置棋子
    QUIT_GAME: 6        // 退出游戏
}

const SERVER_IP = "192.168.1.108"   // 服务器 IP 地址
const SERVER_PORT = 10000           // 通信端口

/**
 * 寻找用户请求的构造方法。 
 * @param username  用户名
 */
function FindUsersRequest(username) {
    this.mType = ProtocolType.FIND_USERS    // 协议类型
    this.mUsername = username               // 用户名
}

/**
 * 寻找用户结果的构造方法。 
 * @param usernameList  用户名列表
 */
function FindUsersResult(usernameList) {
    this.mType = ProtocolType.FIND_USERS    // 协议类型
    this.mUsernameList = usernameList       // 用户名列表
}

/**
 * 游戏结束的构造方法。
 * @param reason    结束原因
 * @param rivalName 对手的名字
 */
function GameOver(reason, rivalName) {
    this.mType = ProtocolType.GAME_OVER     // 协议类型
    this.mReason = reason                   // 结束原因
    this.mUsername = rivalName              // 对手的名字
}

/**
 * 挑战请求的构造方法。
 * @param rivalName 对手的名字
 * @param username  用户名
 */
function InviteRequest(rivalName, username) {
    this.mType = ProtocolType.INVITE_REQUEST    // 协议类型
    this.mRivalName = rivalName                 // 对手的名字
    this.mUsername = username                   // 用户名
}

/**
 * 挑战结果的构造方法。
 * @param accept    接受挑战则为 true，否则为 false
 * @param rivalName 对手的名字
 * @param username  用户名
 */
function InviteResult(accept, rivalName, username) {
    this.mType = ProtocolType.INVITE_RESULT     // 协议类型
    this.mAccept = accept                       // 接受挑战则为 true，否则为 false
    this.mRivalName = rivalName                 // 对手的名字
    this.mUsername = username                   // 用户名
}

/**
 * 登录请求的构造方法。 
 * @param username  用户名
 */
function LogonRequest(username) {
    this.mType = ProtocolType.LOGON     // 协议类型
    this.mUsername = username           // 用户名
}

/**
 * 登录结果的构造方法。 
 * @param username  用户名
 */
function LogonResult(username) {
    this.mType = ProtocolType.LOGON     // 协议类型
    this.mUsername = username           // 用户名
}

/**
 * 放置棋子的构造方法。
 * @param rivalName 对手的名字
 * @param x, y      棋子位置（窗口坐标）
 */
function PutPiece(rivalName, x, y) {
    this.mType = ProtocolType.PUT_PIECE     // 协议类型
    this.mUsername = rivalName              // 对手的名字
    this.mX = x                             // x 坐标（窗口坐标）
    this.mY = y                             // y 坐标（窗口坐标）
}

/**
 * 退出游戏的构造方法。
 * @param username  用户名
 */
function QuitGame(username) {
    this.mType = ProtocolType.QUIT_GAME     // 协议类型
    this.mUsername = username               // 用户名
}

if (typeof module != "undefined") {
    exports = module.exports = {
        SERVER_IP,
        SERVER_PORT,
        ProtocolType,
        FindUsersResult,
        LogonResult,
        QuitGame
    }
}
